//
//  IMVibrateService.h
//  DualMediationSDK
//
//  Created by YeJary on 2025/1/27.
//

#import <Foundation/Foundation.h>
#import "IMVibrateModels.h"

NS_ASSUME_NONNULL_BEGIN

// 震动回调类型定义
typedef void (^IMVibrateCompletionBlock)(IMVibrateResult *result);
typedef void (^IMVibrateProgressBlock)(NSString *vibrateId, NSInteger currentCount);

/**
 * 震动服务类
 * 提供iOS设备震动功能，支持多种震动模式和自定义配置
 */
@interface IMVibrateService : NSObject

/**
 * 单例实例
 */
+ (instancetype)sharedService;

#pragma mark - 基础震动接口

/**
 * 简单震动 - 指定震动时长
 * @param duration 震动时长（毫秒）
 * @param completion 完成回调
 * @return 震动结果
 */
- (IMVibrateResult *)vibrateWithDuration:(NSTimeInterval)duration
                              completion:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 模式震动 - 指定震动频率数组
 * @param pattern 震动频率数组，格式：@[@1000, @500, @1000] 表示震动1秒，停止0.5秒，再震动1秒
 * @param repeatCount 重复次数：-1不重复，0无限重复，>0指定重复次数
 * @param completion 完成回调
 * @return 震动结果
 */
- (IMVibrateResult *)vibrateWithPattern:(NSArray<NSNumber *> *)pattern
                            repeatCount:(NSInteger)repeatCount
                             completion:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 类型震动 - 使用预定义的震动类型
 * @param type 震动类型
 * @param intensity 震动强度
 * @param completion 完成回调
 * @return 震动结果
 */
- (IMVibrateResult *)vibrateWithType:(IMVibrateType)type
                           intensity:(IMVibrateIntensity)intensity
                          completion:(IMVibrateCompletionBlock _Nullable)completion;

#pragma mark - 高级震动接口

/**
 * 配置震动 - 使用震动配置对象
 * @param config 震动配置
 * @param completion 完成回调
 * @return 震动结果
 */
- (IMVibrateResult *)vibrateWithConfig:(IMVibrateConfig *)config
                            completion:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 配置震动 - 带进度回调
 * @param config 震动配置
 * @param progress 进度回调（用于重复震动）
 * @param completion 完成回调
 * @return 震动结果
 */
- (IMVibrateResult *)vibrateWithConfig:(IMVibrateConfig *)config
                              progress:(IMVibrateProgressBlock _Nullable)progress
                            completion:(IMVibrateCompletionBlock _Nullable)completion;

#pragma mark - 震动控制

/**
 * 取消指定震动
 * @param vibrateId 震动ID
 * @return 是否成功取消
 */
- (BOOL)cancelVibrateWithId:(NSString *)vibrateId;

/**
 * 取消所有震动
 * @return 取消的震动数量
 */
- (NSInteger)cancelAllVibrations;

/**
 * 暂停指定震动
 * @param vibrateId 震动ID
 * @return 是否成功暂停
 */
- (BOOL)pauseVibrateWithId:(NSString *)vibrateId;

/**
 * 恢复指定震动
 * @param vibrateId 震动ID
 * @return 是否成功恢复
 */
- (BOOL)resumeVibrateWithId:(NSString *)vibrateId;

#pragma mark - 震动状态查询

/**
 * 检查设备是否支持震动
 * @return YES表示支持，NO表示不支持
 */
- (BOOL)isVibrateSupported;

/**
 * 检查设备是否支持触觉反馈
 * @return YES表示支持，NO表示不支持
 */
- (BOOL)isHapticFeedbackSupported;

/**
 * 获取当前正在执行的震动数量
 * @return 震动数量
 */
- (NSInteger)activeVibrationsCount;

/**
 * 获取指定震动的状态
 * @param vibrateId 震动ID
 * @return 震动状态描述
 */
- (NSString * _Nullable)getVibrateStatus:(NSString *)vibrateId;

#pragma mark - 预设震动模式

/**
 * 成功震动
 */
- (IMVibrateResult *)vibrateSuccess:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 警告震动
 */
- (IMVibrateResult *)vibrateWarning:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 错误震动
 */
- (IMVibrateResult *)vibrateError:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 选择震动
 */
- (IMVibrateResult *)vibrateSelection:(IMVibrateCompletionBlock _Nullable)completion;

/**
 * 冲击震动
 */
- (IMVibrateResult *)vibrateImpact:(IMVibrateCompletionBlock _Nullable)completion;

@end

NS_ASSUME_NONNULL_END